Guest User

Cwiczenie 13

a guest
Dec 4th, 2011
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.10 KB | None | 0 0
  1. /* Cwiczenie 13 */
  2.  
  3. #include <stdio.h>
  4. #include <limits.h>   /* UCHAR_MAX */
  5.  
  6. typedef unsigned int uint;
  7.  
  8. /* Definiujemy typ Bool i stale logiczne. */
  9. typedef char Bool;
  10. #define True 1
  11. #define False 0
  12.  
  13. Bool czyAnagram(const char* str1, const char* str2) {
  14.     /******************** Algorytm **********************/
  15.     /* Sprawdzimy czy dwa wyrazy sa anagramami w bardzo */
  16.     /* prosty sposob. Zliczymy po prostu ilosc kazdej   */
  17.     /* z liter w obu wyrazach, a nastepnie porownamy,   */
  18.     /* czy liczba poszczegolnych liter jest taka sama.  */
  19.     /* Jezeli tak, to mamy anagram!                     */
  20.     /****************************************************/
  21.     uint litery1[UCHAR_MAX+1] = {0};  /* Tablice ilosci poszczegolnych liter. */
  22.     uint litery2[UCHAR_MAX+1] = {0};  /* Inicjalizujemy je zerami.            */
  23.     uint i;                           /* Iterator petli */
  24.     unsigned char c;                  /* Taki maly bufor */
  25.    
  26.     /* Tablice litery[] indeksowane beda znakami typu unsigned char  */
  27.     /* Wykorzystujemy tutaj ceche jezyka C. Mianowicie znaki sa tak  */
  28.     /* naprawde liczbami, wiec bez problemu moga indeksowac tablice. */
  29.    
  30.     /* Ponizsze petle while sluza do zliczenia wystapien liter       */
  31.     /* w wyrazach str1 i str2. Obie postepuja wedlug schematu:       */
  32.     /*   1. Przypisuj c wartosc *strX.                               */
  33.     /*   2. Inkrementuj wskaznik strX - przejdz do nastepnego znaku. */
  34.     /*   3. Inkrementuj wartosc tablicy litery[c].                   */
  35.     /*   4. Wykonuj az natrafisz na znak konca lancucha '\0'.        */
  36.  
  37.     while ( (c = *str1++) )
  38.         litery1[c]++;
  39.        
  40.     while ( (c = *str2++) )
  41.         litery2[c]++;
  42.    
  43.     for (i = 0; i < UCHAR_MAX+1; i++)
  44.         if (litery1[i] != litery2[i])
  45.             return False;
  46.            
  47.     return True;
  48. }
  49.  
  50. void test(const char* str1, const char* str2) {
  51.     if (czyAnagram(str1, str2))
  52.         printf("Wyrazy '%s' i '%s' to anagramy!\n", str1, str2 );
  53.     else
  54.         printf("Wyrazy '%s' i '%s' nie sa anagramami.\n", str1, str2 );
  55.    
  56. }
  57.  
  58. int main(void) {
  59.     test("arbuz", "sofa");
  60.     test("kanonada", "anakonda");
  61.     test("sekret", "kretes");
  62.     test("Godzio", "Eta");
  63.    
  64.     return 0;
  65. }
  66.  
  67.  
Advertisement
Add Comment
Please, Sign In to add comment